#! /bin/sh
### BEGIN INIT INFO
# Provides:          agrego
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: AgreGo initscript
# Description:       This file should to start and stop the agrego daemon
### END INIT INFO

# Author: AgreGo Team <team@agrego.net>
# TODO manage status in best way
# TODO add log message

# Do NOT "set -e"

# AgreGo special function
INI_GET()
{
	grep -Eo "^$1 *= *(.+)$" $INIFILE | sed "s/^$1 *= *//g"
}

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin

ENDPOINT=@@ENDPOINT@@
DESC="AgreGo: the link agregator, $ENDPOINT endpoint"

DAEMON=@@sbindir_@@/agrego-$ENDPOINT
SCRIPTNAME=@@sysconfdir_@@/init.d/agrego-$ENDPOINT

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
	# Return
	#   0 if daemon has been started
	#   1 if daemon was already running
	#   2 if daemon could not be started
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
		|| return 1
	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
		$DAEMON_ARGS \
		|| return 2
	# Add code here, if necessary, that waits for the process to be ready
	# to handle requests from services started subsequently which depend
	# on this one.  As a last resort, sleep for some time.

	sleep 1

	tun_dev_name=`INI_GET tun_dev_name`
	agrego_ip_add=`INI_GET ${ENDPOINT}_agrego_ip_add`

	ifconfig $tun_dev_name $agrego_ip_add netmask 255.255.255.0

	# run start script
	sh $ETC_DIR/start.sh
}

#
# Function that stops the daemon/service
#
do_stop()
{
	# Return
	#   0 if daemon has been stopped
	#   1 if daemon was already stopped
	#   2 if daemon could not be stopped
	#   other if a failure occurred
	start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
	RETVAL="$?"
	[ "$RETVAL" = 2 ] && return 2
	# Wait for children to finish too if this is a daemon that forks
	# and if the daemon is only ever run from this initscript.
	# If the above conditions are not satisfied then add some other code
	# that waits for the process to drop all resources that could be
	# needed by services started subsequently.  A last resort is to
	# sleep for some time.

	start-stop-daemon --stop --quiet --oknodo --retry=TERM/30/KILL/5 --exec $DAEMON
	[ "$?" = 2 ] && return 2
	# Many daemons don't delete their pidfiles when they exit.
	rm -f $PIDFILE

	# run stop script
	sh $ETC_DIR/stop.sh

	return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
	#
	# If the daemon can reload its configuration without
	# restarting (for example, when it is sent a SIGHUP),
	# then implement that here.
	#
	start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
	return 0
}

#
# function to run foreach agrego list
#
do_action() {
	PIDFILE=@@sharedstatedir_@@/run/agrego-$ENDPOINT/$NAME.pid
	ETC_DIR=@@sysconfdir_@@/agrego-$ENDPOINT/$NAME
	INIFILE=$ETC_DIR/agrego.ini
	DAEMON_ARGS="--daemon --pid-file $PIDFILE $INIFILE"

	case "$ACTION" in
	  start)
		[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
		do_start
		case "$?" in
			0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
			2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
		esac
		;;
	  stop)
		[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
		do_stop
		case "$?" in
			0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
			2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
		esac
		;;
	  status)
		  # should not exit here
	       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
	       ;;
	  #reload|force-reload)
		#
		# If do_reload() is not implemented then leave this commented out
		# and leave 'force-reload' as an alias for 'restart'.
		#
		#log_daemon_msg "Reloading $DESC" "$NAME"
		#do_reload
		#log_end_msg $?
		#;;
	  restart|force-reload)
		#
		# If the "reload" option is implemented then remove the
		# 'force-reload' alias
		#
		log_daemon_msg "Restarting $DESC" "$NAME"
		do_stop
		case "$?" in
		  0|1)
			do_start
			case "$?" in
				0) log_end_msg 0 ;;
				1) log_end_msg 1 ;; # Old process is still running
				*) log_end_msg 1 ;; # Failed to start
			esac
			;;
		  *)
			# Failed to stop
			log_end_msg 1
			;;
		esac
		;;
	  *)
		#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
		echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
		exit 3
		;;
	esac

	:
}

if [ $# -eq 0 ]
then
	echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
fi

ACTION=$1
shift 1 # remove first arg

# run ACTION for all agrego installed
if [ $# -eq 0 ]
then
	for NAME in $(@@sbindir_@@/agrego-manage-$ENDPOINT.sh list)
	do
		do_action
	done
	exit 0
fi


for NAME in $@
do
	do_action
done

